package wci.intermediate;


/**
 * <h1>SymTabStack</h1>
 *
 * <p>符号表堆栈，根据层次存放程序运行用到的符号表</p>
 *
 * <p>Copyright (c) 2009 by Ronald Mak</p>
 * <p>For instructional purposes only.  No warranties.</p>
 */
public interface SymTabStack
{
    /**
     * @return 当前运行所在嵌套层次.
     */
    public int getCurrentNestingLevel();

    /**
     * @return 当前运行所在的局部符号表
     */
    public SymTab getLocalSymTab();

    /**
     * 在局部表中建立一个新项
     * @param name 表项名，一般为声明的名字
     * @return 新创建的表项
     */
    public SymTabEntry enterLocal(String name);

    /**
     * 在当前局部表中按名字搜索表项
     * @param name 表项名.
     * @return 表项，不存在返回null.
     */
    public SymTabEntry lookupLocal(String name);

    /**
     * 在整个栈中按照栈顶到栈顶顺序搜索某个表项.
     * @param name 表项名.
     * @return 表项，不存在返回null.
     */
    public SymTabEntry lookup(String name);
    /**
     * 存取程序标识符
     * @param entry
     */
    public void setProgramId(SymTabEntry entry);
    public SymTabEntry getProgramId();
    /**
     * 推入一个新的符号表
     * @return 刚创建的
     */
    public SymTab push();
    /**
     * 推入一个已存在的符号表
     * @param symTab
     * @return
     */
    public SymTab push(SymTab symTab);
    /**
     * 弹出符号表，层级减1
     * @return
     */
    public SymTab pop();
}
